package com.ks.winterwarmimage.mqtt.service;

import android.os.Parcel;
import android.os.Parcelable;

import org.eclipse.paho.client.mqttv3.MqttMessage;

/**
 * <p>
 * 一种通过捆绑包/Intents传递MqttMessage的方法
 * </p>
 *
 * <p>
 * 应用程序可能只会在从Bundle中的服务接收消息时使用它 - 必要的代码如下 :-
 * </p>
 * <pre>
 * <code>
 * 	private void messageArrivedAction(Bundle data) {
 * 		ParcelableMqttMessage message = (ParcelableMqttMessage) data
 * 			.getParcelable(MqttServiceConstants.CALLBACK_MESSAGE_PARCEL);
 *		<i>在消息对象上使用正常的{@link MqttMessage}方法。</i>
 * 	}
 *
 * </code>
 * </pre>
 *
 * <p>
 * 应用程序不太可能直接使用特定于此类的方法。
 * </p>
 */

public class ParcelableMqttMessage extends MqttMessage implements Parcelable {

    String messageId = null;

    ParcelableMqttMessage(MqttMessage original) {
        super(original.getPayload());
        setQos(original.getQos());
        setRetained(original.isRetained());
        setDuplicate(original.isDuplicate());
    }

    ParcelableMqttMessage(Parcel parcel) {
        super(parcel.createByteArray());
        setQos(parcel.readInt());
        boolean[] flags = parcel.createBooleanArray();
        setRetained(flags[0]);
        setDuplicate(flags[1]);
        messageId = parcel.readString();
    }

    /**
     * @return the messageId
     */
    public String getMessageId() {
        return messageId;
    }

    /**
     * 描述此对象的内容
     */
    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * 将此对象的内容写入包
     *
     * @param parcel 要写入数据的包。
     * @param flags 此参数被忽略
     */
    @Override
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeByteArray(getPayload());
        parcel.writeInt(getQos());
        parcel.writeBooleanArray(new boolean[]{isRetained(), isDuplicate()});
        parcel.writeString(messageId);
    }

    /**
     * 从包创建消息对象的创建者
     */
    public static final Creator<ParcelableMqttMessage> CREATOR = new Creator<ParcelableMqttMessage>() {

        /**
         * 从块对象创建消息
         */
        @Override
        public ParcelableMqttMessage createFromParcel(Parcel parcel) {
            return new ParcelableMqttMessage(parcel);
        }

        /**
         * 创建类型为 {@link ParcelableMqttMessage}[]的数组
         *
         */
        @Override
        public ParcelableMqttMessage[] newArray(int size) {
            return new ParcelableMqttMessage[size];
        }
    };
}